package barco;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;

import tablero.Posicion;

public abstract class Barco implements Serializable {

    private static final long serialVersionUID = 1L;
    protected ArrayList<Componente> partesBarco;
    protected byte direccion;

    public int getLongitud() {
        return this.partesBarco.size();
    }

    public ArrayList<Componente> getPartes() {
        return this.partesBarco;
    }

    public Posicion getPosicion() {
        return this.partesBarco.get(0).getPosicion();
    }

    public int cantPartesRestantes() {
        int contador = 0;
        Iterator<Componente> i = partesBarco.iterator();
        while (i.hasNext()) {
            if (i.next().getVida() > 0) {
                contador += 1;
            }
        }
        return contador;
    }

    public byte getDireccion() {
        return this.direccion;
    }

    public void verificarOrientacion(byte filas, byte columnas) {
        int tamanio = this.partesBarco.size() - 1;
        switch (this.direccion) {
            case Direccion.ARRIBAIZQUIERDA:
                if ((this.partesBarco.get(0).getPosicion().getColumna() == 1) || (this.partesBarco.get(0).getPosicion().getFila() == 1))
                    this.direccion = Direccion.ABAJODERECHA;
                break;
            case Direccion.ARRIBA:
                if (this.partesBarco.get(0).getPosicion().getFila() == 1)
                    this.direccion = Direccion.ABAJO;
                break;
            case Direccion.ARRIBADERECHA:
                if ((this.partesBarco.get(0).getPosicion().getFila() == 1) || (this.partesBarco.get(tamanio).getPosicion().getColumna() == columnas))
                    this.direccion = Direccion.ABAJOIZQUIERDA;
                break;
            case Direccion.DERECHA:
                if (this.partesBarco.get(tamanio).getPosicion().getColumna() == columnas)
                    this.direccion = Direccion.IZQUIERDA;
                break;
            case Direccion.ABAJODERECHA:
                if ((this.partesBarco.get(tamanio).getPosicion().getFila() == filas) || (this.partesBarco.get(tamanio).getPosicion().getColumna() == columnas))
                    this.direccion = Direccion.ARRIBAIZQUIERDA;
                break;
            case Direccion.ABAJO:
                if (this.partesBarco.get(tamanio).getPosicion().getFila() == columnas)
                    this.direccion = Direccion.ARRIBA;
                break;
            case Direccion.ABAJOIZQUIERDA:
                if ((this.partesBarco.get(tamanio).getPosicion().getFila() == filas) || (this.partesBarco.get(0).getPosicion().getColumna() == 1))
                    this.direccion = Direccion.ARRIBADERECHA;
                break;
            case Direccion.IZQUIERDA:
                if (this.partesBarco.get(0).getPosicion().getColumna() == 1)
                    this.direccion = Direccion.DERECHA;
                break;

        }

    }

    private Posicion posicionAMover() {
        Posicion posicionAMover = null;
        // La posicionAMover es la posicion que se tendran que mover los componentes.
        // Ej: Si se mueve arriba, es una fila menos(-1) y sin variar columna(0).
        switch (this.direccion) {
            case Direccion.ARRIBAIZQUIERDA:
                posicionAMover = new Posicion(-1, -1);
                break;
            case Direccion.ARRIBA:
                posicionAMover = new Posicion(-1, 0);
                break;
            case Direccion.ARRIBADERECHA:
                posicionAMover = new Posicion(-1, 1);
                break;
            case Direccion.DERECHA:
                posicionAMover = new Posicion(0, 1);
                break;
            case Direccion.ABAJODERECHA:
                posicionAMover = new Posicion(1, 1);
                break;
            case Direccion.ABAJO:
                posicionAMover = new Posicion(1, 0);
                break;
            case Direccion.ABAJOIZQUIERDA:
                posicionAMover = new Posicion(1, -1);
                break;
            case Direccion.IZQUIERDA:
                posicionAMover = new Posicion(0, -1);
                break;
        }
        return posicionAMover;
    }

    public void actualizarPosicionComponentes() {
        Posicion posicionAMover = posicionAMover();
        Iterator<Componente> i = this.partesBarco.iterator();
        while (i.hasNext()) {
            Posicion posicion = i.next().getPosicion();
            posicion.setColumna(posicion.getColumna() + posicionAMover.getColumna());
            posicion.setFila(posicion.getFila() + posicionAMover.getFila());

        }
    }

    public boolean estaVivo() {
        Iterator<Componente> i = partesBarco.iterator();
        while (i.hasNext()) {
            if (i.next().getVida() > 0) {
                return true;
            }
        }
        return false;
    }
}
